﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BussinessLogic
{
    /// <summary>
    /// Clase que maneja la información de un Usuario Autenticado ante el Sistema.
    /// </summary>
    public class UserBaseData
    {
        /// <summary>
        /// Id del Usuario 
        /// </summary>
        public int UserId { get; set; }
        /// <summary>
        /// E-mail del usuario
        /// </summary>
        public string Email { get; set; }
        /// <summary>
        /// Estatus del Usuario 
        /// </summary>
        public Status Estado { get; set; }
        /// <summary>
        /// Fecha del último acceso 
        /// </summary>
        public string LastAccessDate { get; set; }
        /// <summary>
        ///  Número de intentos de acceso fallidos 
        /// </summary>
        public int FailAttemps { get; set; }
        /// <summary>
        /// Nombre del usuario
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// Contraseña del usuario 
        /// </summary>
        public string UserLogin { get; set; }
        /// <summary>
        /// Cédula o número de identificación del usuario 
        /// </summary>
        public string Identificacion { get; set; }
        /// <summary>
        /// Ticket del usuario
        /// </summary>
        public string UserTicket { get; set; }
        /// <summary>
        /// Tipo del Usuario
        /// </summary>
        public UserType TipoDeUsuario { get; set; }
        /// <summary>
        /// "0" si la autenticación es correcta, "1" si la contraseña ha expirado 
        /// </summary>
        public EstadoProceso LogCambioClave { get; set; }

        private List<UserRole> _roles = null;
        /// <summary>
        /// Roles de Usuario
        /// </summary>
        public List<UserRole> Roles
        {
            get
            {
                return _roles;
            }
        }



        /// <summary>
        /// Forma Estatica de Crear un Usuario Autenticado Por Sesión
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="email"></param>
        /// <param name="estado"></param>
        /// <param name="lastAccessDate"></param>
        /// <param name="failAttemps"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <param name="identificacion"></param>
        /// <param name="userTicket"></param>
        /// <param name="logCambioClave"></param>
        /// <param name="tipoDeUsuario"></param>
        /// <param name="roles"></param>
        /// <returns></returns>
        public static UserBaseData CrearUsuario(int userId, string email, Status estado, string lastAccessDate, int failAttemps, string userName, string password, string identificacion, string userTicket, EstadoProceso logCambioClave, UserType tipoDeUsuario, List<UserRole> roles)
        {
            _usuario = new UserBaseData(userId, email, estado, lastAccessDate, failAttemps, userName, password, identificacion, userTicket, logCambioClave, tipoDeUsuario, roles);
            return _usuario;
        }


        /// <summary>
        /// Indica si existe un Usuario autenticado en la sesión.
        /// </summary>
        /// <returns></returns>
        public static bool ExisteUsuario()
        {
            if (_usuario == null)
                return false;
            else
                return true;
        }


        private static UserBaseData _usuario = null;
        /// <summary>
        /// Retorna el Usuario Registrado
        /// </summary>
        /// <returns></returns>
        public static UserBaseData GetUser()
        {
            return _usuario;
        }


        /// <summary>
        /// Constructor Vacio
        /// </summary>
        private UserBaseData()
        { }

        /// <summary>
        /// Constructor de un Usuario.
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="email"></param>
        /// <param name="estado"></param>
        /// <param name="lastAccessDate"></param>
        /// <param name="failAttemps"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <param name="identificacion"></param>
        /// <param name="userTicket"></param>
        /// <param name="logCambioClave"></param>
        /// <param name="tipoDeUsuario"></param>
        /// <param name="roles"></param>
        /// <returns></returns>
        private UserBaseData(int userId, string email, Status estado, string lastAccessDate, int failAttemps, string userName, string password, string identificacion, string userTicket, EstadoProceso logCambioClave, UserType tipoDeUsuario, List<UserRole> roles)
        {
            UserId = userId;
            Email = email;
            Estado = estado;
            LastAccessDate = lastAccessDate;
            FailAttemps = failAttemps;
            UserName = userName;
            UserLogin = password;
            Identificacion = identificacion;
            UserTicket = userTicket;
            LogCambioClave = logCambioClave;
            TipoDeUsuario = tipoDeUsuario;
            _roles = roles;
        }

    }
}
